package java.classe;

import java.parametro.Parametro;
import java.util.ArrayList;

public class Construtor implements TokensSource {
	String nome = null;

	ListaParametros parametros = null;

	String modificador = null;

	ListaAssignException assinaturaExcessoes = null;

	public Construtor(ClasseEntidade classe) {
		this(classe.getNome());
	}

	private Construtor(String nome) {
		this.nome = nome;
	}

	public String codigoFonte() {
		String modificador = this.modificador == null ? NONVALUE
				: this.modificador + ESPACO;
		String parametros = this.parametros == null ? NONVALUE
				: this.parametros.codigoFonte();
		String excessoes = this.assinaturaExcessoes == null ? NONVALUE
				: this.assinaturaExcessoes.codigoFonte();
		return modificador + this.nome + INICIOPARENTECE + parametros
				+ FIMPARENTECE + excessoes + INICIOBLOCO + FIMBLOCO;
	}

	public void addParametro(Parametro parametro) {
		if (parametros == null)
			parametros = new ListaParametros();
		parametros.add(parametro);
	}

	public void setModificador(String modificador) {
		this.modificador = modificador;
	}

	public void addExceptionAssign(Classe classe) {
		assinaturaExcessoes = assinaturaExcessoes == null ? new ListaAssignException()
				: assinaturaExcessoes;
		assinaturaExcessoes.add(classe);
	}

	public class ListaParametros extends ArrayList<Parametro> {
		private static final long serialVersionUID = -261519671768466676L;

		String codigoFonte() {
			String s = get(0).codigoFonte();
			for (int i = 1; i < size(); i++) {
				s += ", " + get(i).codigoFonte();
			}
			return s;
		}
	}

	class ListaAssignException extends ArrayList<Classe> {
		private static final long serialVersionUID = 839299212464437340L;

		String codigoFonte() {
			String s = THROWS + ESPACO + get(0).getNome();
			for (int i = 1; i < size(); i++) {
				s += VIRGULA + ESPACO + get(i).getNome();
			}
			return s;
		}
	}
}
